package Negocio;

import java.util.*;

import javax.swing.JOptionPane;

public class Liquidacion {
	
	public Datos.Liquidacion oDatos;

	/**
	 * Agrega una Liquidacion a la base de datos;
	 * @param item
	 * @return
	 * @throws Exception
	 */
	public int Add(Entidades.Liquidacion item) throws Exception{
		Datos.Liquidacion oDatos;
		try{
			oDatos = new Datos.Liquidacion();
			return oDatos.Add(item);
		}finally {
			oDatos = null;
		}
	}
	/**
	 * Actualiza una Liquidacion a la base de datos;
	 * @param item
	 * @throws Exception
	 */
	public void Update(Entidades.Liquidacion item) throws Exception{
		Datos.Liquidacion oDatos;
		try{
			oDatos = new Datos.Liquidacion();
			oDatos.Update(item);
		}finally {
			oDatos = null;
		}
	}
	/**
	 * Elimina una Liquidacion de la base de datos;
	 * @param id
	 * @throws Exception
	 */
	public void Delete(int id) throws Exception{
		Datos.Liquidacion oDatos;
		try{
			oDatos = new Datos.Liquidacion();
			oDatos.Delete(id);
		}finally {
			oDatos = null;
		}
	}
	/**
	 * Obtiene una Liquidacion en base a un id;
	 * @param id
	 * @return
	 * @throws Exception
	 */
	public List GetOne(int id) throws Exception{
		Datos.Liquidacion oDatos;
		try{
			oDatos = new Datos.Liquidacion();
			return oDatos.GetOne(id);
		}finally {
			oDatos = null;
		}
	}
	/**
	 * Retorna todos los Liquidaciones de la base de Datos;
	 * @return
	 * @throws Exception
	 */
	public List GetAll() throws  Exception{
		Datos.Liquidacion oDatos;
		try{
			oDatos = new Datos.Liquidacion();
			return oDatos.GetAll();
		}finally {
			oDatos = null;
		}
	}
	/**
	 * Obtiene una lista de Liquidaciones en base a una consulta;
	 * @param id
	 * @return
	 * @throws Exception
	 */
	public List Consulta(String id) throws Exception{
		Datos.Liquidacion oDatos;
		try{
			oDatos = new Datos.Liquidacion();
			return oDatos.Consulta(id);
		}finally {
			oDatos = null;
		}
	}
	/**
	 * Abre el canal para el movimiento dentro de la tabla;
	 * @throws Exception
	 */
	public void Abrir() throws Exception{
			oDatos = new Datos.Liquidacion();
			oDatos.Abrir();
	}
	/**
	 * Cierra el canal para el movimiento dentro de la tabla;
	 * @throws Exception
	 */
	public void Cerrar() throws Exception{
			oDatos.Cerrar();
			return;
	}
	/**
	 * Obtiene el Primer registro de la tabla Liquidacion;
	 * @return
	 * @throws Exception
	 */
	public List Primero() throws Exception{
			return oDatos.Primero();
	}
	/**
	 * Obtiene el Siguiente registro de la tabla Liquidacion;
	 * @return
	 * @throws Exception
	 */
	public List Siguiente() throws Exception{
			return oDatos.Siguiente();
	}
	/**
	 * Obtiene el Anterior registro de la tabla Liquidacion;
	 * @return
	 * @throws Exception
	 */
	public List Anterior() throws Exception{
			return oDatos.Anterior();
	}
	/**
	 * Obtiene el Ultimo registro de la tabla Liquidacion;
	 * @return
	 * @throws Exception
	 */
	public List Ultimo() throws Exception{
			return oDatos.Ultimo();
	}

	
	/**
	 * Arma una Lista con todos los CPDs disponibles del Liquidacion
	 * @param unComi
	 * @return
	 * @throws Exception
	 */
/*	public List buscarCPDdisponibles(Entidades.Liquidacion unComi) throws Exception{
		//Datos.Liquidacion oDatos;
		List listaCPDs = new ArrayList();
		try{
			//oDatos = new Datos.Liquidacion();
			//return oDatos.GetOne(id);
		}finally {
			//oDatos = null;
		}
		return listaCPDs;
	}
*/
	/**
	 * Arma una Lista con todas las operaciones del Liquidacion;
	 * @param unComi
	 * @return
	 * @throws Exception
	 */
/*	public List buscarOperacionesRealizadas(Entidades.Liquidacion unComi) throws Exception{
			//Datos.Liquidacion oDatos;
			List listaOperaciones = new ArrayList();
			try{
				//oDatos = new Datos.Liquidacion();
				//return oDatos.GetOne(id);
			}finally {
				//oDatos = null;
			}
			return listaOperaciones;		
	}
*/
	public List Liquidaciones(Date fechaConcertacion, Entidades.TipoLiquidacion tipoLiqui, int nroLiq) throws Exception{
		List liquidaciones = new ArrayList();
		Datos.Liquidacion oDatos;
		String consulta = "";
		try{
			consulta = " WHERE (idTipoLiquidacion='" + tipoLiqui.getIdTipoLiquidacion() 
					+ "' AND nroLiquidacion = " + nroLiq 
					+ " AND fecConcertacion = '" 
					+ new java.sql.Date(fechaConcertacion.getTime()) 
					+ "' ) ORDER BY idLiquidacion ";
			System.out.println("Consulta SQL = " + consulta);
			oDatos = new Datos.Liquidacion();
			liquidaciones = oDatos.Consulta(consulta);
		}finally {
			//oDatos = null;
		}

		return liquidaciones;
	}
	public List CPDSinLiquidar(Date fechaConcertacion, Entidades.TipoLiquidacion tipoLiqui) throws Exception{
		List cpdSinLiquidar = new ArrayList();
		cpdSinLiquidar = Liquidaciones(fechaConcertacion, tipoLiqui, 0);
		return cpdSinLiquidar;
	}
	public void validarTasa(Entidades.Orden orden, Entidades.TipoLiquidacion tipoLiqui, float tasa){
		if(orden.getTasa()<tasa){
			JOptionPane.showMessageDialog(null, "Tasa de Descuento supera la registrada en la Orden." +
					"\nTasa solicitada: " +
					orden.getTasa() + "%", "Alerta", JOptionPane.WARNING_MESSAGE);
		}
	}
	public void agregarCPDnegociado(List operaciones, Entidades.CPD unCPD, Entidades.Orden unaOrden,
			Entidades.TipoLiquidacion unTipoLiquidacion, Date fchConcert, Date fchLiquid,
			Entidades.Contraparte unaContraparte, Float tasaNeg, List ordenes){
		Entidades.OrdenVenta unaOrdenVenta = null;
		List oOrdenes = new ArrayList();
		Entidades.Liquidacion liqui = null;
		List lineas =  new ArrayList();
		Entidades.LineaLiquidacion linea = null;
		for(int i=0; i<operaciones.size(); i++){
			liqui = (Entidades.Liquidacion) operaciones.get(i);
			lineas = liqui.getLineaLiquidacion();
			if (liqui.getComitente().getIdComitente().equals(unaOrden.getComitente().getIdComitente())){
				System.out.println("Mismo Comitente: " + unaOrden.getComitente().getDenominacion());
				if (liqui.getFchLiquidacion().equals(fchLiquid)){
					System.out.println("Misma Fecha Liquidacion: " + fchLiquid);
					for(int f=0; f<lineas.size(); f++){
						linea = (Entidades.LineaLiquidacion) lineas.get(f);
						try {
							oOrdenes = (new Negocio.OrdenVenta()).buscarOrdenContieneCPD(ordenes, linea.getCPD().getIdCPDNegociacion());
						} catch (Exception e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						while(!oOrdenes.isEmpty()){
							unaOrdenVenta = (Entidades.OrdenVenta) oOrdenes.remove(0);
						}
						//this.agregarEnTabla(liqui, linea, unaOrdenVenta);
					}
					//lineas = null;
					if (unaOrden.getNroOrden() == unaOrdenVenta.getNroOrden()){
						System.out.println("Misma orden de Venta: " + unaOrden.getNroOrden());
					} else {
						System.out.println("CPD en distinta orden: " + unaOrden.getNroOrden() + " = " + unaOrdenVenta.getNroOrden());
					}
					
				} else {
					
				}
			} else {
				System.out.println("Comitente Orden: " + unaOrden.getComitente().getDenominacion());
				System.out.println("Comitente Liquidacion: " + liqui.getComitente().getDenominacion());
			}
			/*	
			for(int f=0; f<lineas.size(); f++){
				linea = (Entidades.LineaLiquidacion) lineas.get(f);
				try {
					oOrdenes = (new Negocio.OrdenVenta()).buscarOrdenContieneCPD(ordenes, linea.getCPD().getIdCPDNegociacion());
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				while(!oOrdenes.isEmpty()){
					unaOrdenVenta = (Entidades.OrdenVenta) oOrdenes.remove(0);
				}
				this.agregarEnTabla(liqui, linea, unaOrdenVenta);
			}
			lineas = null;
			*/
		}
	}

	
}
